#Disclaimer For my final project I really wanted to find something
neuroscience related. It is remarkably hard to find data that meets all
of the criterion, related to my field of interest, public access, clean
and easily interprettable data that can be imported into R. I found a
great data set with lots of observations and variables but honestly it
was over my head and hard to understand what was going on. While the
data was open access, there weren’t great explanations of all the data
collected. I was reluctant to use a dataset I didn’t really understand
but started doing preliminary exploration and found out that they had
transformed and normalized values for EMG data. So I found one of the
only R packages that has neuroscience datasets, the neuropsychology
package. Unfortunately there is really no reliable explanations on how
the variables were tested. For example they will have numerical data for
“Empathy & Agreeableness” but I have no idea what kind of survey or
test was conducted to get these values. That being said it is the best
data I can find related to neuroscience so we shouldn’t take anything
too seriously as I can’t back up any claims I find as I don’t know how
the data was collected.
# Load dataset (archived from neuropsychology package)
tmpfile <- tempfile(fileext = ".tar.gz")
download.file(
"https://cran.r-project.org/src/contrib/Archive/neuropsychology/neuropsychology_0.5.0.tar.gz",
destfile = tmpfile, mode = "wb"
)
td <- tempdir()
untar(tmpfile, exdir = td)
cand <- list.files(td, pattern = "personality\\.(rda|RData|rds)$",
recursive = TRUE, full.names = TRUE, ignore.case = TRUE)
load(cand[1]) # loads `personality`
library(ggplot2)
library(broom)
library(car)
##Introdcution
For this project I will be using the personality data set from the
neuropsychology package.The personality data is on personality traits
and was collected from normal and “pathological” subjects from an online
questionnaire. While we don’t know much about the validity of the data,
by looking at the structure of the data we can see that it has multiple
categorical data and numerical that satisfy the needs of this
project.
str(personality)
'data.frame': 1327 obs. of 20 variables:
$ Sex : Factor w/ 2 levels "F","M": 1 2 1 1 1 1 2 1 2 1 ...
$ Age : num 25 25.9 22.2 27.3 49 ...
$ Salary : int 2 3 0 2 3 3 0 0 2 0 ...
$ Study_Level : int 6 6 5 6 6 5 3 6 6 6 ...
$ Mood_Disorder : Factor w/ 2 levels "Absence","Presence": 1 1 1 1 1 1 1 1 2 1 ...
$ BMI : num 22.6 21.9 23.1 18.6 21.2 ...
$ Meditation : Factor w/ 2 levels "No","Yes": 1 1 2 1 1 2 1 1 1 1 ...
$ Sport : Factor w/ 2 levels "No","Yes": 1 2 2 1 2 1 2 2 2 1 ...
$ Music : Factor w/ 2 levels "No","Yes": 1 2 1 1 2 1 2 1 1 1 ...
$ Extraversion : num 4.75 3.25 5.5 5 2.75 2.75 6.25 4.75 2.25 4.5 ...
$ Empathy.Agreeableness : num 3.5 3.5 6.5 4.75 6.25 3.5 6 7 6 6.25 ...
$ Conscientiousness : num 2.25 2.25 3.75 0.75 2.25 2.75 4.75 5.75 5.75 3 ...
$ Instability.Neuroticism : num 4.75 2 3.25 3.5 2 4.75 4.5 3 2.25 5.75 ...
$ Openness_to_Experience.Intellect: num 3.75 4 6 5.25 4.5 2.5 6 4 5.5 5 ...
$ Honesty.Humility : num 1 4.75 7 7 7 6.5 5.5 6.25 6.25 6.5 ...
$ Disinhibition : num 5.8 2 3.2 4.8 1 2.4 3.6 1.2 1.8 2.2 ...
$ Detachment : num 2.8 2.2 1 0.2 2.4 2 1.6 0.2 1.2 0.8 ...
$ Psychoticism : num 4 1.4 2.6 0.2 2.6 2.4 3.8 0.2 1.2 1 ...
$ Negative_Affect : num 6.2 2.4 2.2 1.6 2 4.2 4.2 0.4 4.4 4.8 ...
$ Antagonism : num 4.6 2.6 1.4 2.8 2 1.2 3.4 1.2 1.6 1 ...
Time to explore some of the data, we will start with something basic
like salary. Salary is often looked at as a response variable. A classic
example to start with to visualize our data is salary against education.
Study level is broken into 7 subcategories with 3 being a highschool
degree, 5 a bachelor degree, 6 masters, 7 doctorate. Below high school
education we have no degree (0), secondary education degree (1) and
youth training (2; maybe an apprenticeship program). It would be very
nice if we had the actual profession as well because it would be
interesting to see what the point in the upper lefthand corner
corresponds to. It is curious to see a subject with no degree having the
same salary as doctorates. We see dense clustering around 0 on the
salary axis throughout education levels 3-6. It is hard to know exactly
why we see this, it could be due to sampling variability, or how the
survey was conducted. There could be problems with the population that
the survey was distributed to and there may be some survey bias.
ggplot(personality, aes(y = Salary, x = Study_Level)) + geom_jitter() +ggtitle("Effects of Educational Achievement on Salary") + xlab("Education Level")

Another interesting question would be how does the level of
psychoticism affect salary? We will explore the relationship between
psychoticism and salary with a scatter plot (psychoticism is numerical
not categorical). The scatterplot below may not be exactly what you
expect to see, but we do see that the higher we go on the psychoticism
axis the less data points we have at higher salaries however, just like
in the previous graph exploring salary and education, the overwhelming
majority of the salary data is below 2 which may suggest our sample of
salary is lacking in data for wealthier survey participants.
ggplot(personality, aes(y = Salary, x = Psychoticism)) + geom_jitter() + ggtitle("Effects of Psychoticism on Salary")

Let’s see what happens when we add gender as an explanatory variable
to the graph we just created. The below graph seems to have a pretty
even spread of gender throughout psychoticism level but it does seem we
have more females in general.
ggplot(personality, aes(y = Salary, x = Psychoticism, color = Sex)) + geom_jitter() + ggtitle("Salary Against Gender and Psychoticism")

The previous graph suggested that there were more females in this
dataset than males, we can see if this is true by making a simple table,
and as we can see we have far more females than males in this dataset.
While it would be interesting to have gender as a categorical
explanatory variable, we may want to shy away from this given that there
are almost 4 times as many women than men in the dataset.
table(personality$Sex)
F M
1053 274
While there is a large disparity in the counts for gender, we can try
an work around this by creating a contingency table with percentages.
Below is a contingency table exploring gender and mood disorder.
Gender_Mood_Table <- table(personality$Sex, personality$Mood_Disorder)
Gender_Mood_Table <- cbind(Gender_Mood_Table, rowSums(Gender_Mood_Table), rowSums(Gender_Mood_Table)/sum(Gender_Mood_Table))
colnames(Gender_Mood_Table) <- c("Absence", "Presence", "Totals", "Percentages")
Gender_Mood_Table
Absence Presence Totals Percentages
F 941 112 1053 0.7935192
M 245 29 274 0.2064808
Luckily we caught the imbalance in gender in the dataset however, I
think it is important to keep exploring the data and see what else we
cand find. While we don’t have data on any medications, it is well known
that certain mood altering medications (mostly antipsychotics) can alter
metabolism and lead to weight gain. Additionally we are not told what
mood disorder really means and what the criteria for having a mood
disorder are. Just for the sake of thoroughness I thought it would be
interesting to see whether having a mood disorder or not could influence
BMI as is shown in the boxplot below. There doesn’t seem to be any
noticeable diferences between absence or presence.
ggplot(personality, aes(y = BMI, x = Mood_Disorder)) + geom_boxplot() + ggtitle("Effects of Mood Disorder on Body Mass Index") + xlab("Mood Disorder")

One relationship that should jump out and seem obvious to us is the
relationship between Psychoticism and if the participant has a mood
disorder or not. Not surprsingly there does seem to be a difference
between having and not having a mood disorder on the level of
psychoticism. The median score on the psychoticism scale for Absence is
2 while the median score for subjects who have a mood disorder is 3.
ggplot(personality, aes(y = Psychoticism, x = Mood_Disorder)) + geom_boxplot() + ggtitle("Effects of Mood Disorder on level of Psychoticism") + xlab("Mood Disorder")

If we had good data on both genders the next obvious explanatory
variable to add to the previous graph would be gender. Although we lack
a good sample of Males, we will see what happens when we factor gender
into the previous plot.
ggplot(personality, aes(y = Psychoticism, x = Mood_Disorder, color = Sex)) + geom_boxplot() + ggtitle("Psychoticism Scores Grouped by Presence/Absence of Mood Disorder & Gender") + xlab("Mood Disorder")

To test some of the other data, we should pick some relationships we
would expect to have correlations to see how normal the sample is. For
example, one would assume that someone who scores high on antagonism
would probably score low on Honesty and Humility and that we may see a
negative trend in this relationship. Below is a scatterplot of
Antagonism against Honesty and Humility. Sure enough we see a negative
trend, the general relationship is the higher you rank on honesty and
humility the lower your antagonism score is and vice versa. However, it
should be noted that there is some fanning of the data with more results
for high Honesty and humility than results for Antagonism.
ggplot(data = personality, aes(y = Antagonism, x = Honesty.Humility)) + geom_point() + xlab("Honesty & Humility") + ggtitle("Antagonism against Honesty & Humility")

We are starting to get a good grasp on the data, I like the idea of
investigating some of the personality traits that are more seriously
related to possible mental illness such as psychoticism, neuroticism,
negative affect, and detachment. Since we have done some exploration on
psychoticism (a very serious mental condition that often is accompanied
by schizophrenia), let’s explore negative affect quickly. People who
have a high negative affect have a higher propensity to experience
negative feelings and tend to have a more negative experience of their
surroundings in general. For this reason there may be a relationship
between negative affect and neuroticism. Briefly, neuroticism is
considered one of the big five personality traits in psychology, and a
brief wikipedia search of neuroticism makes claims about high
neuroticism scores being associated with anxiety, depression, anger,
fear and an increased risk for mood disorders. Let’s explore our data
and see if we can find anything similar to those claims.
ggplot(personality, aes(y = Instability.Neuroticism, x = Negative_Affect)) + geom_point() + ggtitle("Level of Negative Affect on Severity of Neuroticism") + ylab("Neuroticism") + xlab("Negative Affect")

As we can see from the plot above there indeed does seem to be a
positive trend between negative affect and Neuroticism. Let’s continue
to explore negative affect and see how it may relate to the level of
psychoticism. Here we will put Neuroticism on the x axis because it
makes more sense that neuroticism could predict psychosis than the other
way around.
ggplot(personality, aes(y = Psychoticism, x = Instability.Neuroticism, color = Sex)) + geom_point() + ggtitle("Effects of Neuroticism and Psychoticism") + xlab("Neuroticism")

There are just two more variables I would like to visualize with
psychoticism, disinhibition and detachment. Disinhibition is a hallmark
of many different mental illnesses. Basically disinhibition is exactly
what it sounds like, trouble controlling and inhibiting certain actions,
sometimes called impulsivity, disinhibition can have large real life
effects like poor risk management. Let’s see how the two may relate.
ggplot(personality, aes(y =Psychoticism, x = Disinhibition, color = Sex )) + geom_point() + ggtitle("Psychoticism against Disinhibition")

While there may be some heteroscedasticity (there certainly is an
uneven spread), there does seem to be a positive trend between
Disinhibition and Psychoticism. Finally let’s look at detachment and
psychoticism, detachment is the inability to connect emotionally with
others. This can happen naturally or can be done delibrerately as an
avoidance measure.
ggplot(personality, aes(y = Psychoticism, x = Detachment, color = Sex)) + geom_point() + ggtitle("Psychoticism against Detachment")

This graph is very similar to psychoticism against disinhibition and
without more data on men it is hard to tell if there is a lot of
difference between genders.
##Multiple Regression
We will use psychoticism as our numerical response variable and use
detachment and gender as our explanatory variables.
#building the regression model
Psych_detachment <- lm(Psychoticism ~ Detachment + Sex, data = personality)
Psych_detachment
Call:
lm(formula = Psychoticism ~ Detachment + Sex, data = personality)
Coefficients:
(Intercept) Detachment SexM
1.1339 0.5962 0.3644
It is probably a good idea to check our numerical variables for
normal distribution
ggplot(personality, aes(x = Psychoticism)) + geom_histogram(binwidth = .5) + ggtitle("Psychoticism Counts")

ggplot(personality, aes(x = Detachment)) + geom_histogram(binwidth = .5) + ggtitle("Histogram of Detachment Scores")

There is defintely some right skew in both of the histograms. We can
use the symbox command to see if any transformations could help the data
appear more normal. We will hold off on that for now though and just
proceed with the model we have.
We have already created some scatter plots of the data but let’s
check the residuals and get an indea of influential points and possible
outliers.
plot(Psych_detachment, which = 1:2)

NA

While the Quantile plot doesn’t look terrible, the Residual plot
isn’t great. The models predictions are not a great fit. There is a
slight bit of fanning and the data isn’t that evenly distributed. Let’s
check out the Cook’s distances which is another direct measure of
influence (discrepency x Leverage). The influence plot with cooks
distances respresented by the size of the bubble is a little
overwhelming when we have this much data.
influencePlot(Psych_detachment)

#Multiple Regression Anova
Below is the output from the anova command. Detachment has a huge F
value and a ridiculously small p-value indicating detachment is a
significant predictor of psychoticism. Sex also has a significanct p
value but a much smaller F score and value overall, so it helps explain
the level of psychoticism but not a strongly as detachment in this
model.
anova(Psych_detachment)
Analysis of Variance Table
Response: Psychoticism
Df Sum Sq Mean Sq F value Pr(>F)
Detachment 1 677.78 677.78 332.599 < 2.2e-16 ***
Sex 1 28.63 28.63 14.048 0.0001859 ***
Residuals 1324 2698.10 2.04
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(dplyr)
Attaching package: ‘dplyr’
The following object is masked from ‘package:car’:
recode
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Psych_means <- personality %>% group_by(Detachment, Sex) %>% summarize(mean_psych = mean(Psychoticism))
`summarise()` has grouped output by 'Detachment'. You can override using the `.groups` argument.
head(Psych_means)
Now we can make an interaction plot. It is a messy plot given the
sheer amount of data we have and it isn’t just a simple low middle and
high explanatory variable on the x axis which makes it hard to follow
and see if there are parrallel lines. I see differential slopes but I
also do see some mirrored slope movements throughout the graph. Although
there are some spots that are parrallel there is enough variation
between the slopes, and they do cross at a few points which makes me
think there may be an interaction present.
ggplot(personality, aes(y = Psychoticism, x = Detachment, color = Sex)) + geom_point(data = Psych_means, aes(y = mean_psych, x = Detachment, color = Sex)) + geom_line(data = Psych_means, aes(y = mean_psych, x = Detachment, color = Sex)) + ggtitle("Interaction Plot of Psychoticism Against Detachment Grouped by Gender")

To explore a model with interactions we can build a second linear
model with an interaction term and run an ANOVA on both of them to see
if the model with interaction is significant.
Psych_Detach_Int <- lm(Psychoticism ~ Detachment * Sex, data = personality)
anova(Psych_detachment, Psych_Detach_Int)
Analysis of Variance Table
Model 1: Psychoticism ~ Detachment + Sex
Model 2: Psychoticism ~ Detachment * Sex
Res.Df RSS Df Sum of Sq F Pr(>F)
1 1324 2698.1
2 1323 2697.2 1 0.85632 0.42 0.517
The anova output has a very low F score and large P value suggesting
the model with interaction does not provide any more statistical power
than the model without interaction.
Below we use the tidy command to easily get our estimates for
interpretation.
library(broom)
Psych_Tidy <- tidy(Psych_Detach_Int)
Psych_Tidy
Intercept: When detachment and gender are 0 the model predicts
psychoticism will be 1.11, the intercept often doesn’t make sense in
this type of regression unless we mean center.
Detachment: As detachment increases one unit, the model predicts that
the psychoticism score will increase by .608 for both female and
males.
GenderM: The Model predicts that males will have a predicted
psychoticism score that is 0.465 points more than females with the same
detachment score.
Detachment:SexM = The model predicts that the slope of the regression
line for a Male will be 0.052 points smaller than the slope for
females.
##ANOVA
We will use the same response variable of psychoticism score and we
will continue to use gender as a categorical explanatory variable
however, instead of using detachment score we will use whether or not
the participant makes music or not.
personality_cont <- personality
contrasts(personality_cont$Sex) <- "contr.sum"
contrasts(personality_cont$Sex)
[,1]
F 1
M -1
Deviance coding the second explanatory variable
contrasts(personality_cont$Music) <- "contr.sum"
contrasts(personality_cont$Music)
[,1]
No 1
Yes -1
Creating the Anova model
Psych_Anova <- lm(Psychoticism ~ Sex + Music, data = personality_cont)
Anova(Psych_Anova)
Anova Table (Type II tests)
Response: Psychoticism
Sum Sq Df F value Pr(>F)
Sex 48.6 1 19.3803 1.157e-05 ***
Music 22.6 1 9.0124 0.002732 **
Residuals 3321.9 1324
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The output from the anova table suggests that Sex is a very
significant factor in predictin psychoticism scores, an F value of 19.4
is very high and we have an an incredibly small p value. Music appears
to be less significant than Sex but is still well below our threshold of
.05 suggesting that music has a signficant effect on an individuals
psychoticism score. Below is an output of the estimates from this
model.
Psych_Anova_tidy <- tidy(Psych_Anova)
Psych_Anova_tidy
Our intercept of 2.51 is the grand mean. Sex1 which is females is
0.239 points below the grand mean of 2.51. Music1 is coded as 1 for no
and -1 for yes. So Non musicians will have a psychotocism score that is
0.159 point below the grand mean.
Testing For Interaction
Calculate the cell means
psychoticism_anova_means <- personality_cont %>% group_by(Sex, Music) %>% summarize(mean_psych_anova = mean(Psychoticism))
`summarise()` has grouped output by 'Sex'. You can override using the `.groups` argument.
psychoticism_anova_means
Creating an Interaction Plot
ggplot(personality_cont, aes(y = Psychoticism, x = Sex, color = Music)) + geom_point(data = psychoticism_anova_means, aes(y = mean_psych_anova, x = Sex, color = Music)) + geom_line(data = psychoticism_anova_means, aes(y = mean_psych_anova, x = Sex, group = Music)) + ggtitle("Interaction Plot of Psychoticism Against Gender and Music")

Because we see very parrallel lines it would imply that there is no
interaction.
We can build another model with the interaction term and run an ANOVA
on both models to see if the interaction term adds any significant
value.
Psych_Anova_Int <- lm(Psychoticism ~ Sex + Music + Sex:Music, data = personality_cont)
anova(Psych_Anova,Psych_Anova_Int)
Analysis of Variance Table
Model 1: Psychoticism ~ Sex + Music
Model 2: Psychoticism ~ Sex + Music + Sex:Music
Res.Df RSS Df Sum of Sq F Pr(>F)
1 1324 3321.9
2 1323 3320.3 1 1.6278 0.6486 0.4208
It would appear that the interaction term is not significant.
We can gather the means from the coefficients and we will use the
interacation model even though it doesn’t appear more effective than the
main effects model.
tidy(Psych_Anova_Int)
The intercept again is our grand mean of 2.51. Sex is coded F = 1 and
M = -1 and Music is coded No = 1 and Yes = -1. So to get the mean of
females who don’t practice music we start with the grand mean of 2.51 -
0.258 - 0.180 + 0.0478 (because both sex and Music are “on”) = 2.1198.
To get the non-musician males we start with the grand mean 2.51 + 0.258
- .180 - 0.0478 (because sexM (-1)*Music1(1) = -1) = 2.502. Female
Musicians: 2.51 - .258 + .180 - 0.0478 = 2.384. Male Musicians: 2.51 +
.258 + .180 + .0478 = 2.996
##Meaningful Model
We will refer back to the model used in the multiple regression. As
we saw above it looked like our data coud benefit from a transformation.
Let’s look at a quick histogram of pyshcoticism scores again. As we can
see from the histogram we have some left skew in the data.
ggplot(personality, aes(x = Psychoticism)) + geom_histogram(binwidth = .5) + ggtitle("Histogram Displaying Skewed data for Psychoticism scores")

Using the symbox command from the car package we can test different
lambda values to see what kind of transformation will work best. As we
see below we can get closer to a normal model by using a power
transformation of .5 (square root) but the log transformation looks
almost as good, and we know how to interpret log transformations without
back transforming results. For that reason we will use the log instead
of square root transformation.
library(car)
symbox(~ Psychoticism, data = personality)
Warning: start set to 0.07

Let’s check the histogram for detachment again to assess possible
skew. Similar to Pyschoticism, there seems to be some left skew in the
data.
ggplot(personality, aes(x = Detachment)) + geom_histogram(binwidth = 0.75) + ggtitle("Histogram Showing Skewed data for Detachment")

Again we can use symbox to see what type of transformation may fit
best with the Detachment data. Again, a power transformation of 0.5
(square root) would appear to fit best. But interpretting square roots
is a lot less intuitive than intrepretting normal or log transformed
data so we will stick with the log transformation because while it
doesn’t look as perfect as the 0.5 transformation, it looks better than
the original data.
symbox(~ Detachment, data = personality)
Warning: start set to 0.06

Below is a histogram of log transformed detachment. While the it is a
bit right skewed now it will be much easier to interpret the log of
detachment rather than the square root of detachment. It does look a
litte better than the original data.
ggplot(personality, aes(x = log(Detachment))) + geom_histogram(binwidth = .5) + ggtitle("Normalized (Log) histogram of Detachment")

We will proceed with the log transformed response variable of
Psychoticism and the log transformed explanatory variable Detachment.
Gender obviously doesn’t need to be transformed as it is a binary factor
variable. Below are both the log transormed scatterplot and the normal
untransformed scatterplot. Just at a quick glance there don’t appear to
be any major outliers in either plot. There are a few points that are a
little further away from the general data cluster but they don’t appear
far enough away at first glance to know if they are truly outliers. We
will makes some influnece plots to test for outliers.
ggplot(personality, aes(y = log(Psychoticism), x = log(Detachment), color = Sex)) + geom_point() + ggtitle("Log Pschoticism scores against Log Detachment scores and Gender")

ggplot(personality, aes(y = Psychoticism, x = Detachment, color = Sex)) + geom_point() + ggtitle("Pschoticism scores against Detachment scores and Gender")

To further test for outliers we need to build the linear model so we
will do that real quickly.
personality2 <- data.frame(personality %>% mutate(Psychoticism = Psychoticism + 1, detachment = Detachment + 1, Sex = Sex))
Psychoticism_LM <- lm(log(Psychoticism) ~ log(detachment) + Sex, data = personality2)
To statistically test for outliers we can use a built in command
called OutlierTest. The basic principle is to run T tests to examine
residuals but we run into a problem of multiple comparisons when we run
so many T tests. With a alpha of 0.05 that means we will get a false
positive once every 20 tests but we have over a 1000 data points in this
data frame so we would see false positives if we were to proceed with an
alpha level of 0.05. The OutlierTest factors this in by dividing our
alpha of 0.05 by the number of data points and that should help prevent
false positives. We likely won’t see any outliers now because we have
such a small alpha threshold. The good thing is that with such a large
data set the influence that any possible outliers may have would be
small and hopefully not skew our regression analysis too much.
outlierTest(Psychoticism_LM)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
After Bonferonni corrections there are no major outliers in our data
set. This output shows us which of the points had the largest residual.
It appears particpant 769 had the largest residuals but these were still
not significant after Bonferonni corrections.
We can also look at the Dfbetas of the linear model which will show
the effect of removing possibly influential points on the intercept and
slope of the regression. Dfbetas is a more standardized version of
dfbeta taken by dividing the dfbeta by the standard error without the
point of interest. Basically we are looking out for points larger than 2
which none of our data even gets close to so we don’t have to worry much
here.
head(dfbetas(Psychoticism_LM))
(Intercept) log(detachment) SexM
1 -0.0067614761 0.020251780 -0.012541239
2 0.0071660746 -0.008114237 -0.045641979
3 0.0221681004 -0.011673235 -0.010398916
4 -0.0525532198 0.044013339 0.009270151
5 -0.0004962572 0.003708612 -0.003012446
6 0.0009553665 0.002471109 -0.003248014
We can look at influence plots such as a residual plot to show us any
patterns or anomolies in the residuals. We can also look at a QQ plot of
the residuals to see if the residuals are normally distributed
plot(Psychoticism_LM, which = 1:2)


Overall there don’t seem to any major patterns in the residual plot,
there is perhaps some fanning of the data (heteroskedasticity) but the
data does look normal enough. Looking at our QQ plot the data does
follow the line for the most part but we have some deviations from the
plot at the tail ends but beyond those slight curvatures there is no
major curving of the QQ plot.
We already checked a model previously that used an interaction
between gender and detachment score that didn’t appear to be significant
so we will continue with our linear model without interaction.
Psychoticism_LM
Call:
lm(formula = log(Psychoticism) ~ log(detachment) + Sex, data = personality2)
Coefficients:
(Intercept) log(detachment) SexM
0.5202 0.5488 0.1170
The model predicts that a one percent increase in Detachment will
increase the psychoticism score by .55 percent. Similarly, the model
predicts that by being male your psychoticism score is increased by .12
percent. Again by checking an anova table to see the significance of our
effects shows us that detachment is a very significant predictor of
psychoticism score. Not as significant but still fairly significant is
gender, the male gender tended to have slightly higher psychoticism
scores and the anova confirms that gender can also be used as a
significant predictor of psychoticism but not as well as detachment
score.
anova(Psychoticism_LM)
Analysis of Variance Table
Response: log(Psychoticism)
Df Sum Sq Mean Sq F value Pr(>F)
log(detachment) 1 78.784 78.784 365.766 < 2.2e-16 ***
Sex 1 2.950 2.950 13.697 0.0002236 ***
Residuals 1324 285.182 0.215
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
LS0tCnRpdGxlOiAiUGVyc29uYWxpdHlfQW5hbHlzaXNfRmluYWxfRGF0YV9Qcm9qZWN0IgphdXRob3I6ICJCZW4gU21pdGgiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgZ2l0aHViX2RvY3VtZW50OiAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAyICAgIAogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAgICAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRoZW1lOiB5ZXRpCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9Cgprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyAgICAgICA9IFRSVUUsICAgCiAgd2FybmluZyAgICA9IEZBTFNFLCAgCiAgbWVzc2FnZSAgICA9IEZBTFNFLCAgCiAgZmlnLmFsaWduICA9ICJjZW50ZXIiLCAKICBmaWcud2lkdGggID0gNiwgICAgIAogIGZpZy5oZWlnaHQgPSA0LCAgICAgIAogIGZpZy5wYXRoICAgPSAiZmlncy8iCiAgZHBpID0gMTUwKQpgYGAKCiNEaXNjbGFpbWVyCkZvciBteSBmaW5hbCBwcm9qZWN0IEkgcmVhbGx5IHdhbnRlZCB0byBmaW5kIHNvbWV0aGluZyBuZXVyb3NjaWVuY2UgcmVsYXRlZC4gSXQgaXMgcmVtYXJrYWJseSBoYXJkIHRvIGZpbmQgZGF0YSB0aGF0IG1lZXRzIGFsbCBvZiB0aGUgY3JpdGVyaW9uLCByZWxhdGVkIHRvIG15IGZpZWxkIG9mIGludGVyZXN0LCBwdWJsaWMgYWNjZXNzLCBjbGVhbiBhbmQgZWFzaWx5IGludGVycHJldHRhYmxlIGRhdGEgdGhhdCBjYW4gYmUgaW1wb3J0ZWQgaW50byBSLiBJIGZvdW5kIGEgZ3JlYXQgZGF0YSBzZXQgd2l0aCBsb3RzIG9mIG9ic2VydmF0aW9ucyBhbmQgdmFyaWFibGVzIGJ1dCBob25lc3RseSBpdCB3YXMgb3ZlciBteSBoZWFkIGFuZCBoYXJkIHRvIHVuZGVyc3RhbmQgd2hhdCB3YXMgZ29pbmcgb24uIFdoaWxlIHRoZSBkYXRhIHdhcyBvcGVuIGFjY2VzcywgdGhlcmUgd2VyZW4ndCBncmVhdCBleHBsYW5hdGlvbnMgb2YgYWxsIHRoZSBkYXRhIGNvbGxlY3RlZC4gSSB3YXMgcmVsdWN0YW50IHRvIHVzZSBhIGRhdGFzZXQgSSBkaWRuJ3QgcmVhbGx5IHVuZGVyc3RhbmQgYnV0IHN0YXJ0ZWQgZG9pbmcgcHJlbGltaW5hcnkgZXhwbG9yYXRpb24gYW5kIGZvdW5kIG91dCB0aGF0IHRoZXkgaGFkIHRyYW5zZm9ybWVkIGFuZCBub3JtYWxpemVkIHZhbHVlcyBmb3IgRU1HIGRhdGEuIFNvIEkgZm91bmQgb25lIG9mIHRoZSBvbmx5IFIgcGFja2FnZXMgdGhhdCBoYXMgbmV1cm9zY2llbmNlIGRhdGFzZXRzLCB0aGUgbmV1cm9wc3ljaG9sb2d5IHBhY2thZ2UuIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgcmVhbGx5IG5vIHJlbGlhYmxlIGV4cGxhbmF0aW9ucyBvbiBob3cgdGhlIHZhcmlhYmxlcyB3ZXJlIHRlc3RlZC4gRm9yIGV4YW1wbGUgdGhleSB3aWxsIGhhdmUgbnVtZXJpY2FsIGRhdGEgZm9yICJFbXBhdGh5ICYgQWdyZWVhYmxlbmVzcyIgYnV0IEkgaGF2ZSBubyBpZGVhIHdoYXQga2luZCBvZiBzdXJ2ZXkgb3IgdGVzdCB3YXMgY29uZHVjdGVkIHRvIGdldCB0aGVzZSB2YWx1ZXMuIFRoYXQgYmVpbmcgc2FpZCBpdCBpcyB0aGUgYmVzdCBkYXRhIEkgY2FuIGZpbmQgcmVsYXRlZCB0byBuZXVyb3NjaWVuY2Ugc28gd2Ugc2hvdWxkbid0IHRha2UgYW55dGhpbmcgdG9vIHNlcmlvdXNseSBhcyBJIGNhbid0IGJhY2sgdXAgYW55IGNsYWltcyBJIGZpbmQgYXMgSSBkb24ndCBrbm93IGhvdyB0aGUgZGF0YSB3YXMgY29sbGVjdGVkLiAKYGBge3J9CiMgTG9hZCBkYXRhc2V0IChhcmNoaXZlZCBmcm9tIG5ldXJvcHN5Y2hvbG9neSBwYWNrYWdlKQp0bXBmaWxlIDwtIHRlbXBmaWxlKGZpbGVleHQgPSAiLnRhci5neiIpCmRvd25sb2FkLmZpbGUoCiAgImh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3NyYy9jb250cmliL0FyY2hpdmUvbmV1cm9wc3ljaG9sb2d5L25ldXJvcHN5Y2hvbG9neV8wLjUuMC50YXIuZ3oiLAogIGRlc3RmaWxlID0gdG1wZmlsZSwgbW9kZSA9ICJ3YiIKKQp0ZCA8LSB0ZW1wZGlyKCkKdW50YXIodG1wZmlsZSwgZXhkaXIgPSB0ZCkKY2FuZCA8LSBsaXN0LmZpbGVzKHRkLCBwYXR0ZXJuID0gInBlcnNvbmFsaXR5XFwuKHJkYXxSRGF0YXxyZHMpJCIsCiAgICAgICAgICAgICAgICAgICByZWN1cnNpdmUgPSBUUlVFLCBmdWxsLm5hbWVzID0gVFJVRSwgaWdub3JlLmNhc2UgPSBUUlVFKQpsb2FkKGNhbmRbMV0pICAjIGxvYWRzIGBwZXJzb25hbGl0eWAKCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShicm9vbSkKbGlicmFyeShjYXIpCmBgYAoKIyNJbnRyb2RjdXRpb24KCkZvciB0aGlzIHByb2plY3QgSSB3aWxsIGJlIHVzaW5nIHRoZSBwZXJzb25hbGl0eSBkYXRhIHNldCBmcm9tIHRoZSBuZXVyb3BzeWNob2xvZ3kgcGFja2FnZS5UaGUgcGVyc29uYWxpdHkgZGF0YSBpcyBvbiBwZXJzb25hbGl0eSB0cmFpdHMgYW5kIHdhcyBjb2xsZWN0ZWQgZnJvbSBub3JtYWwgYW5kICJwYXRob2xvZ2ljYWwiIHN1YmplY3RzIGZyb20gYW4gb25saW5lIHF1ZXN0aW9ubmFpcmUuIFdoaWxlIHdlIGRvbid0IGtub3cgbXVjaCBhYm91dCB0aGUgdmFsaWRpdHkgb2YgdGhlIGRhdGEsIGJ5IGxvb2tpbmcgYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSB3ZSBjYW4gc2VlIHRoYXQgaXQgaGFzIG11bHRpcGxlIGNhdGVnb3JpY2FsIGRhdGEgYW5kIG51bWVyaWNhbCB0aGF0IHNhdGlzZnkgdGhlIG5lZWRzIG9mIHRoaXMgcHJvamVjdC4gCgpgYGB7cn0Kc3RyKHBlcnNvbmFsaXR5KQpgYGAKVGltZSB0byBleHBsb3JlIHNvbWUgb2YgdGhlIGRhdGEsIHdlIHdpbGwgc3RhcnQgd2l0aCBzb21ldGhpbmcgYmFzaWMgbGlrZSBzYWxhcnkuIFNhbGFyeSBpcyBvZnRlbiBsb29rZWQgYXQgYXMgYSByZXNwb25zZSB2YXJpYWJsZS4gQSBjbGFzc2ljIGV4YW1wbGUgdG8gc3RhcnQgd2l0aCB0byB2aXN1YWxpemUgb3VyIGRhdGEgaXMgc2FsYXJ5IGFnYWluc3QgZWR1Y2F0aW9uLiBTdHVkeSBsZXZlbCBpcyBicm9rZW4gaW50byA3IHN1YmNhdGVnb3JpZXMgd2l0aCAzIGJlaW5nIGEgaGlnaHNjaG9vbCBkZWdyZWUsIDUgYSBiYWNoZWxvciBkZWdyZWUsIDYgbWFzdGVycywgNyBkb2N0b3JhdGUuIEJlbG93IGhpZ2ggc2Nob29sIGVkdWNhdGlvbiB3ZSBoYXZlIG5vIGRlZ3JlZSAoMCksIHNlY29uZGFyeSBlZHVjYXRpb24gZGVncmVlICgxKSBhbmQgeW91dGggdHJhaW5pbmcgKDI7IG1heWJlIGFuIGFwcHJlbnRpY2VzaGlwIHByb2dyYW0pLiBJdCB3b3VsZCBiZSB2ZXJ5IG5pY2UgaWYgd2UgaGFkIHRoZSBhY3R1YWwgcHJvZmVzc2lvbiBhcyB3ZWxsIGJlY2F1c2UgaXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIHdoYXQgdGhlIHBvaW50IGluIHRoZSB1cHBlciBsZWZ0aGFuZCBjb3JuZXIgY29ycmVzcG9uZHMgdG8uIEl0IGlzIGN1cmlvdXMgdG8gc2VlIGEgc3ViamVjdCB3aXRoIG5vIGRlZ3JlZSBoYXZpbmcgdGhlIHNhbWUgc2FsYXJ5IGFzIGRvY3RvcmF0ZXMuIFdlIHNlZSBkZW5zZSBjbHVzdGVyaW5nIGFyb3VuZCAwIG9uIHRoZSBzYWxhcnkgYXhpcyB0aHJvdWdob3V0IGVkdWNhdGlvbiBsZXZlbHMgMy02LiBJdCBpcyBoYXJkIHRvIGtub3cgZXhhY3RseSB3aHkgd2Ugc2VlIHRoaXMsIGl0IGNvdWxkIGJlIGR1ZSB0byBzYW1wbGluZyB2YXJpYWJpbGl0eSwgb3IgaG93IHRoZSBzdXJ2ZXkgd2FzIGNvbmR1Y3RlZC4gVGhlcmUgY291bGQgYmUgcHJvYmxlbXMgd2l0aCB0aGUgcG9wdWxhdGlvbiB0aGF0IHRoZSBzdXJ2ZXkgd2FzIGRpc3RyaWJ1dGVkIHRvIGFuZCB0aGVyZSBtYXkgYmUgc29tZSBzdXJ2ZXkgYmlhcy4gCgpgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9IFNhbGFyeSwgeCA9IFN0dWR5X0xldmVsKSkgKyBnZW9tX2ppdHRlcigpICtnZ3RpdGxlKCJFZmZlY3RzIG9mIEVkdWNhdGlvbmFsIEFjaGlldmVtZW50IG9uIFNhbGFyeSIpICsgeGxhYigiRWR1Y2F0aW9uIExldmVsIikKYGBgCgpBbm90aGVyIGludGVyZXN0aW5nIHF1ZXN0aW9uIHdvdWxkIGJlIGhvdyBkb2VzIHRoZSBsZXZlbCBvZiBwc3ljaG90aWNpc20gYWZmZWN0IHNhbGFyeT8gV2Ugd2lsbCBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwc3ljaG90aWNpc20gYW5kIHNhbGFyeSB3aXRoIGEgc2NhdHRlciBwbG90IChwc3ljaG90aWNpc20gaXMgbnVtZXJpY2FsIG5vdCBjYXRlZ29yaWNhbCkuIFRoZSBzY2F0dGVycGxvdCBiZWxvdyBtYXkgbm90IGJlIGV4YWN0bHkgd2hhdCB5b3UgZXhwZWN0IHRvIHNlZSwgYnV0IHdlIGRvIHNlZSB0aGF0IHRoZSBoaWdoZXIgd2UgZ28gb24gdGhlIHBzeWNob3RpY2lzbSBheGlzIHRoZSBsZXNzIGRhdGEgcG9pbnRzIHdlIGhhdmUgYXQgaGlnaGVyIHNhbGFyaWVzIGhvd2V2ZXIsIGp1c3QgbGlrZSBpbiB0aGUgcHJldmlvdXMgZ3JhcGggZXhwbG9yaW5nIHNhbGFyeSBhbmQgZWR1Y2F0aW9uLCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIHRoZSBzYWxhcnkgZGF0YSBpcyBiZWxvdyAyIHdoaWNoIG1heSBzdWdnZXN0IG91ciBzYW1wbGUgb2Ygc2FsYXJ5IGlzIGxhY2tpbmcgaW4gZGF0YSBmb3Igd2VhbHRoaWVyIHN1cnZleSBwYXJ0aWNpcGFudHMuIAoKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHkgPSBTYWxhcnksIHggPSBQc3ljaG90aWNpc20pKSArIGdlb21faml0dGVyKCkgKyBnZ3RpdGxlKCJFZmZlY3RzIG9mIFBzeWNob3RpY2lzbSBvbiBTYWxhcnkiKQpgYGAKTGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHdlIGFkZCBnZW5kZXIgYXMgYW4gZXhwbGFuYXRvcnkgdmFyaWFibGUgdG8gdGhlIGdyYXBoIHdlIGp1c3QgY3JlYXRlZC4gVGhlIGJlbG93IGdyYXBoIHNlZW1zIHRvIGhhdmUgYSBwcmV0dHkgZXZlbiBzcHJlYWQgb2YgZ2VuZGVyIHRocm91Z2hvdXQgcHN5Y2hvdGljaXNtIGxldmVsIGJ1dCBpdCBkb2VzIHNlZW0gd2UgaGF2ZSBtb3JlIGZlbWFsZXMgaW4gZ2VuZXJhbC4gCgpgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9IFNhbGFyeSwgeCA9IFBzeWNob3RpY2lzbSwgY29sb3IgPSBTZXgpKSArIGdlb21faml0dGVyKCkgKyBnZ3RpdGxlKCJTYWxhcnkgQWdhaW5zdCBHZW5kZXIgYW5kIFBzeWNob3RpY2lzbSIpCmBgYAoKVGhlIHByZXZpb3VzIGdyYXBoIHN1Z2dlc3RlZCB0aGF0IHRoZXJlIHdlcmUgbW9yZSBmZW1hbGVzIGluIHRoaXMgZGF0YXNldCB0aGFuIG1hbGVzLCB3ZSBjYW4gc2VlIGlmIHRoaXMgaXMgdHJ1ZSBieSBtYWtpbmcgYSBzaW1wbGUgdGFibGUsIGFuZCBhcyB3ZSBjYW4gc2VlIHdlIGhhdmUgZmFyIG1vcmUgZmVtYWxlcyB0aGFuIG1hbGVzIGluIHRoaXMgZGF0YXNldC4gV2hpbGUgaXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gaGF2ZSBnZW5kZXIgYXMgYSBjYXRlZ29yaWNhbCBleHBsYW5hdG9yeSB2YXJpYWJsZSwgd2UgbWF5IHdhbnQgdG8gc2h5IGF3YXkgZnJvbSB0aGlzIGdpdmVuIHRoYXQgdGhlcmUgYXJlIGFsbW9zdCA0IHRpbWVzIGFzIG1hbnkgd29tZW4gdGhhbiBtZW4gaW4gdGhlIGRhdGFzZXQuIAoKYGBge3J9CnRhYmxlKHBlcnNvbmFsaXR5JFNleCkgCgpgYGAKCldoaWxlIHRoZXJlIGlzIGEgbGFyZ2UgZGlzcGFyaXR5IGluIHRoZSBjb3VudHMgZm9yIGdlbmRlciwgd2UgY2FuIHRyeSBhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IGNyZWF0aW5nIGEgY29udGluZ2VuY3kgdGFibGUgd2l0aCBwZXJjZW50YWdlcy4gQmVsb3cgaXMgYSBjb250aW5nZW5jeSB0YWJsZSBleHBsb3JpbmcgZ2VuZGVyIGFuZCBtb29kIGRpc29yZGVyLiAKCmBgYHtyfQpHZW5kZXJfTW9vZF9UYWJsZSA8LSB0YWJsZShwZXJzb25hbGl0eSRTZXgsIHBlcnNvbmFsaXR5JE1vb2RfRGlzb3JkZXIpCkdlbmRlcl9Nb29kX1RhYmxlIDwtIGNiaW5kKEdlbmRlcl9Nb29kX1RhYmxlLCByb3dTdW1zKEdlbmRlcl9Nb29kX1RhYmxlKSwgcm93U3VtcyhHZW5kZXJfTW9vZF9UYWJsZSkvc3VtKEdlbmRlcl9Nb29kX1RhYmxlKSkKY29sbmFtZXMoR2VuZGVyX01vb2RfVGFibGUpIDwtIGMoIkFic2VuY2UiLCAiUHJlc2VuY2UiLCAiVG90YWxzIiwgIlBlcmNlbnRhZ2VzIikKR2VuZGVyX01vb2RfVGFibGUKYGBgCgpMdWNraWx5IHdlIGNhdWdodCB0aGUgaW1iYWxhbmNlIGluIGdlbmRlciBpbiB0aGUgZGF0YXNldCBob3dldmVyLCBJIHRoaW5rIGl0IGlzIGltcG9ydGFudCB0byBrZWVwIGV4cGxvcmluZyB0aGUgZGF0YSBhbmQgc2VlIHdoYXQgZWxzZSB3ZSBjYW5kIGZpbmQuIFdoaWxlIHdlIGRvbid0IGhhdmUgZGF0YSBvbiBhbnkgbWVkaWNhdGlvbnMsIGl0IGlzIHdlbGwga25vd24gdGhhdCBjZXJ0YWluIG1vb2QgYWx0ZXJpbmcgbWVkaWNhdGlvbnMgKG1vc3RseSBhbnRpcHN5Y2hvdGljcykgY2FuIGFsdGVyIG1ldGFib2xpc20gYW5kIGxlYWQgdG8gd2VpZ2h0IGdhaW4uIEFkZGl0aW9uYWxseSB3ZSBhcmUgbm90IHRvbGQgd2hhdCBtb29kIGRpc29yZGVyIHJlYWxseSBtZWFucyBhbmQgd2hhdCB0aGUgY3JpdGVyaWEgZm9yIGhhdmluZyBhIG1vb2QgZGlzb3JkZXIgYXJlLiBKdXN0IGZvciB0aGUgc2FrZSBvZiB0aG9yb3VnaG5lc3MgSSB0aG91Z2h0IGl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHNlZSB3aGV0aGVyIGhhdmluZyBhIG1vb2QgZGlzb3JkZXIgb3Igbm90IGNvdWxkIGluZmx1ZW5jZSBCTUkgYXMgaXMgc2hvd24gaW4gdGhlIGJveHBsb3QgYmVsb3cuIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgbm90aWNlYWJsZSBkaWZlcmVuY2VzIGJldHdlZW4gYWJzZW5jZSBvciBwcmVzZW5jZS4gIApgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9IEJNSSwgeCA9IE1vb2RfRGlzb3JkZXIpKSArIGdlb21fYm94cGxvdCgpICsgZ2d0aXRsZSgiRWZmZWN0cyBvZiBNb29kIERpc29yZGVyIG9uIEJvZHkgTWFzcyBJbmRleCIpICsgeGxhYigiTW9vZCBEaXNvcmRlciIpCgpgYGAKCk9uZSByZWxhdGlvbnNoaXAgdGhhdCBzaG91bGQganVtcCBvdXQgYW5kIHNlZW0gb2J2aW91cyB0byB1cyBpcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gUHN5Y2hvdGljaXNtIGFuZCBpZiB0aGUgcGFydGljaXBhbnQgaGFzIGEgbW9vZCBkaXNvcmRlciBvciBub3QuIE5vdCBzdXJwcnNpbmdseSB0aGVyZSBkb2VzIHNlZW0gdG8gYmUgYSBkaWZmZXJlbmNlIGJldHdlZW4gaGF2aW5nIGFuZCBub3QgaGF2aW5nIGEgbW9vZCBkaXNvcmRlciBvbiB0aGUgbGV2ZWwgb2YgcHN5Y2hvdGljaXNtLiBUaGUgbWVkaWFuIHNjb3JlIG9uIHRoZSBwc3ljaG90aWNpc20gc2NhbGUgZm9yIEFic2VuY2UgaXMgMiB3aGlsZSB0aGUgbWVkaWFuIHNjb3JlIGZvciBzdWJqZWN0cyB3aG8gaGF2ZSBhIG1vb2QgZGlzb3JkZXIgaXMgMy4gIAoKYGBge1J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHkgPSBQc3ljaG90aWNpc20sIHggPSBNb29kX0Rpc29yZGVyKSkgKyBnZW9tX2JveHBsb3QoKSArIGdndGl0bGUoIkVmZmVjdHMgb2YgTW9vZCBEaXNvcmRlciBvbiBsZXZlbCBvZiBQc3ljaG90aWNpc20iKSArIHhsYWIoIk1vb2QgRGlzb3JkZXIiKQpgYGAKCklmIHdlIGhhZCBnb29kIGRhdGEgb24gYm90aCBnZW5kZXJzIHRoZSBuZXh0IG9idmlvdXMgZXhwbGFuYXRvcnkgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBwcmV2aW91cyBncmFwaCB3b3VsZCBiZSBnZW5kZXIuIEFsdGhvdWdoIHdlIGxhY2sgYSBnb29kIHNhbXBsZSBvZiBNYWxlcywgd2Ugd2lsbCBzZWUgd2hhdCBoYXBwZW5zIHdoZW4gd2UgZmFjdG9yIGdlbmRlciBpbnRvIHRoZSBwcmV2aW91cyBwbG90LgoKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHkgPSBQc3ljaG90aWNpc20sIHggPSBNb29kX0Rpc29yZGVyLCBjb2xvciA9IFNleCkpICsgZ2VvbV9ib3hwbG90KCkgKyBnZ3RpdGxlKCJQc3ljaG90aWNpc20gU2NvcmVzIEdyb3VwZWQgYnkgUHJlc2VuY2UvQWJzZW5jZSBvZiBNb29kIERpc29yZGVyICYgR2VuZGVyIikgKyB4bGFiKCJNb29kIERpc29yZGVyIikKCmBgYApUbyB0ZXN0IHNvbWUgb2YgdGhlIG90aGVyIGRhdGEsIHdlIHNob3VsZCBwaWNrIHNvbWUgcmVsYXRpb25zaGlwcyB3ZSB3b3VsZCBleHBlY3QgdG8gaGF2ZSBjb3JyZWxhdGlvbnMgdG8gc2VlIGhvdyBub3JtYWwgdGhlIHNhbXBsZSBpcy4gRm9yIGV4YW1wbGUsIG9uZSB3b3VsZCBhc3N1bWUgdGhhdCBzb21lb25lIHdobyBzY29yZXMgaGlnaCBvbiBhbnRhZ29uaXNtIHdvdWxkIHByb2JhYmx5IHNjb3JlIGxvdyBvbiBIb25lc3R5IGFuZCBIdW1pbGl0eSBhbmQgdGhhdCB3ZSBtYXkgc2VlIGEgbmVnYXRpdmUgdHJlbmQgaW4gdGhpcyByZWxhdGlvbnNoaXAuIEJlbG93IGlzIGEgc2NhdHRlcnBsb3Qgb2YgQW50YWdvbmlzbSBhZ2FpbnN0IEhvbmVzdHkgYW5kIEh1bWlsaXR5LiBTdXJlIGVub3VnaCB3ZSBzZWUgYSBuZWdhdGl2ZSB0cmVuZCwgdGhlIGdlbmVyYWwgcmVsYXRpb25zaGlwIGlzIHRoZSBoaWdoZXIgeW91IHJhbmsgb24gaG9uZXN0eSBhbmQgaHVtaWxpdHkgdGhlIGxvd2VyIHlvdXIgYW50YWdvbmlzbSBzY29yZSBpcyBhbmQgdmljZSB2ZXJzYS4gSG93ZXZlciwgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlcmUgaXMgc29tZSBmYW5uaW5nIG9mIHRoZSBkYXRhIHdpdGggbW9yZSByZXN1bHRzIGZvciBoaWdoIEhvbmVzdHkgYW5kIGh1bWlsaXR5IHRoYW4gcmVzdWx0cyBmb3IgQW50YWdvbmlzbS4KCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBwZXJzb25hbGl0eSwgYWVzKHkgPSBBbnRhZ29uaXNtLCB4ID0gSG9uZXN0eS5IdW1pbGl0eSkpICsgZ2VvbV9wb2ludCgpICsgeGxhYigiSG9uZXN0eSAmIEh1bWlsaXR5IikgKyBnZ3RpdGxlKCJBbnRhZ29uaXNtIGFnYWluc3QgSG9uZXN0eSAmIEh1bWlsaXR5IikKYGBgCgoKV2UgYXJlIHN0YXJ0aW5nIHRvIGdldCBhIGdvb2QgZ3Jhc3Agb24gdGhlIGRhdGEsIEkgbGlrZSB0aGUgaWRlYSBvZiBpbnZlc3RpZ2F0aW5nIHNvbWUgb2YgdGhlIHBlcnNvbmFsaXR5IHRyYWl0cyB0aGF0IGFyZSBtb3JlIHNlcmlvdXNseSByZWxhdGVkIHRvIHBvc3NpYmxlIG1lbnRhbCBpbGxuZXNzIHN1Y2ggYXMgcHN5Y2hvdGljaXNtLCBuZXVyb3RpY2lzbSwgbmVnYXRpdmUgYWZmZWN0LCBhbmQgZGV0YWNobWVudC4gU2luY2Ugd2UgaGF2ZSBkb25lIHNvbWUgZXhwbG9yYXRpb24gb24gcHN5Y2hvdGljaXNtIChhIHZlcnkgc2VyaW91cyBtZW50YWwgY29uZGl0aW9uIHRoYXQgb2Z0ZW4gaXMgYWNjb21wYW5pZWQgYnkgc2NoaXpvcGhyZW5pYSksIGxldCdzIGV4cGxvcmUgbmVnYXRpdmUgYWZmZWN0IHF1aWNrbHkuIFBlb3BsZSB3aG8gaGF2ZSBhIGhpZ2ggbmVnYXRpdmUgYWZmZWN0IGhhdmUgYSBoaWdoZXIgcHJvcGVuc2l0eSB0byBleHBlcmllbmNlIG5lZ2F0aXZlIGZlZWxpbmdzIGFuZCB0ZW5kIHRvIGhhdmUgYSBtb3JlIG5lZ2F0aXZlIGV4cGVyaWVuY2Ugb2YgdGhlaXIgc3Vycm91bmRpbmdzIGluIGdlbmVyYWwuIEZvciB0aGlzIHJlYXNvbiB0aGVyZSBtYXkgYmUgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBuZWdhdGl2ZSBhZmZlY3QgYW5kIG5ldXJvdGljaXNtLiBCcmllZmx5LCBuZXVyb3RpY2lzbSBpcyBjb25zaWRlcmVkIG9uZSBvZiB0aGUgYmlnIGZpdmUgcGVyc29uYWxpdHkgdHJhaXRzIGluIHBzeWNob2xvZ3ksIGFuZCBhIGJyaWVmIHdpa2lwZWRpYSBzZWFyY2ggb2YgbmV1cm90aWNpc20gbWFrZXMgY2xhaW1zIGFib3V0IGhpZ2ggbmV1cm90aWNpc20gc2NvcmVzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBhbnhpZXR5LCBkZXByZXNzaW9uLCBhbmdlciwgZmVhciBhbmQgYW4gaW5jcmVhc2VkIHJpc2sgZm9yIG1vb2QgZGlzb3JkZXJzLiBMZXQncyBleHBsb3JlIG91ciBkYXRhIGFuZCBzZWUgaWYgd2UgY2FuIGZpbmQgYW55dGhpbmcgc2ltaWxhciB0byB0aG9zZSBjbGFpbXMuCgpgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9IEluc3RhYmlsaXR5Lk5ldXJvdGljaXNtLCB4ID0gTmVnYXRpdmVfQWZmZWN0KSkgKyBnZW9tX3BvaW50KCkgKyBnZ3RpdGxlKCJMZXZlbCBvZiBOZWdhdGl2ZSBBZmZlY3Qgb24gU2V2ZXJpdHkgb2YgTmV1cm90aWNpc20iKSArIHlsYWIoIk5ldXJvdGljaXNtIikgKyB4bGFiKCJOZWdhdGl2ZSBBZmZlY3QiKQpgYGAKCkFzIHdlIGNhbiBzZWUgZnJvbSB0aGUgcGxvdCBhYm92ZSB0aGVyZSBpbmRlZWQgZG9lcyBzZWVtIHRvIGJlIGEgcG9zaXRpdmUgdHJlbmQgYmV0d2VlbiBuZWdhdGl2ZSBhZmZlY3QgYW5kIE5ldXJvdGljaXNtLiBMZXQncyBjb250aW51ZSB0byBleHBsb3JlIG5lZ2F0aXZlIGFmZmVjdCBhbmQgc2VlIGhvdyBpdCBtYXkgcmVsYXRlIHRvIHRoZSBsZXZlbCBvZiBwc3ljaG90aWNpc20uIEhlcmUgd2Ugd2lsbCBwdXQgTmV1cm90aWNpc20gb24gdGhlIHggYXhpcyBiZWNhdXNlIGl0IG1ha2VzIG1vcmUgc2Vuc2UgdGhhdCBuZXVyb3RpY2lzbSBjb3VsZCBwcmVkaWN0IHBzeWNob3NpcyB0aGFuIHRoZSBvdGhlciB3YXkgYXJvdW5kLiAKCmBgYHtyfQpnZ3Bsb3QocGVyc29uYWxpdHksIGFlcyh5ID0gUHN5Y2hvdGljaXNtLCB4ID0gSW5zdGFiaWxpdHkuTmV1cm90aWNpc20sIGNvbG9yID0gU2V4KSkgKyBnZW9tX3BvaW50KCkgKyBnZ3RpdGxlKCJFZmZlY3RzIG9mIE5ldXJvdGljaXNtIGFuZCBQc3ljaG90aWNpc20iKSArIHhsYWIoIk5ldXJvdGljaXNtIikKYGBgCgpUaGVyZSBhcmUganVzdCB0d28gbW9yZSB2YXJpYWJsZXMgSSB3b3VsZCBsaWtlIHRvIHZpc3VhbGl6ZSB3aXRoIHBzeWNob3RpY2lzbSwgZGlzaW5oaWJpdGlvbiBhbmQgZGV0YWNobWVudC4gRGlzaW5oaWJpdGlvbiBpcyBhIGhhbGxtYXJrIG9mIG1hbnkgZGlmZmVyZW50IG1lbnRhbCBpbGxuZXNzZXMuIEJhc2ljYWxseSBkaXNpbmhpYml0aW9uIGlzIGV4YWN0bHkgd2hhdCBpdCBzb3VuZHMgbGlrZSwgdHJvdWJsZSBjb250cm9sbGluZyBhbmQgaW5oaWJpdGluZyBjZXJ0YWluIGFjdGlvbnMsIHNvbWV0aW1lcyBjYWxsZWQgaW1wdWxzaXZpdHksIGRpc2luaGliaXRpb24gY2FuIGhhdmUgbGFyZ2UgcmVhbCBsaWZlIGVmZmVjdHMgbGlrZSBwb29yIHJpc2sgbWFuYWdlbWVudC4gTGV0J3Mgc2VlIGhvdyB0aGUgdHdvIG1heSByZWxhdGUuCgpgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9UHN5Y2hvdGljaXNtLCB4ID0gRGlzaW5oaWJpdGlvbiwgY29sb3IgPSBTZXggKSkgKyBnZW9tX3BvaW50KCkgKyBnZ3RpdGxlKCJQc3ljaG90aWNpc20gYWdhaW5zdCBEaXNpbmhpYml0aW9uIikgCmBgYAoKV2hpbGUgdGhlcmUgbWF5IGJlIHNvbWUgaGV0ZXJvc2NlZGFzdGljaXR5ICh0aGVyZSBjZXJ0YWlubHkgaXMgYW4gdW5ldmVuIHNwcmVhZCksIHRoZXJlIGRvZXMgc2VlbSB0byBiZSBhIHBvc2l0aXZlIHRyZW5kIGJldHdlZW4gRGlzaW5oaWJpdGlvbiBhbmQgUHN5Y2hvdGljaXNtLiBGaW5hbGx5IGxldCdzIGxvb2sgYXQgZGV0YWNobWVudCBhbmQgcHN5Y2hvdGljaXNtLCBkZXRhY2htZW50IGlzIHRoZSBpbmFiaWxpdHkgdG8gY29ubmVjdCBlbW90aW9uYWxseSB3aXRoIG90aGVycy4gVGhpcyBjYW4gaGFwcGVuIG5hdHVyYWxseSBvciBjYW4gYmUgZG9uZSBkZWxpYnJlcmF0ZWx5IGFzIGFuIGF2b2lkYW5jZSBtZWFzdXJlLiAKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHkgPSBQc3ljaG90aWNpc20sIHggPSBEZXRhY2htZW50LCBjb2xvciA9IFNleCkpICsgZ2VvbV9wb2ludCgpICsgZ2d0aXRsZSgiUHN5Y2hvdGljaXNtIGFnYWluc3QgRGV0YWNobWVudCIpCmBgYAoKVGhpcyBncmFwaCBpcyB2ZXJ5IHNpbWlsYXIgdG8gcHN5Y2hvdGljaXNtIGFnYWluc3QgZGlzaW5oaWJpdGlvbiBhbmQgd2l0aG91dCBtb3JlIGRhdGEgb24gbWVuIGl0IGlzIGhhcmQgdG8gdGVsbCBpZiB0aGVyZSBpcyBhIGxvdCBvZiBkaWZmZXJlbmNlIGJldHdlZW4gZ2VuZGVycy4gCgojI011bHRpcGxlIFJlZ3Jlc3Npb24KCldlIHdpbGwgdXNlIHBzeWNob3RpY2lzbSBhcyBvdXIgbnVtZXJpY2FsIHJlc3BvbnNlIHZhcmlhYmxlIGFuZCB1c2UgZGV0YWNobWVudCBhbmQgZ2VuZGVyIGFzIG91ciBleHBsYW5hdG9yeSB2YXJpYWJsZXMuCgpgYGB7cn0KI2J1aWxkaW5nIHRoZSByZWdyZXNzaW9uIG1vZGVsClBzeWNoX2RldGFjaG1lbnQgPC0gbG0oUHN5Y2hvdGljaXNtIH4gRGV0YWNobWVudCArIFNleCwgZGF0YSA9IHBlcnNvbmFsaXR5KQpQc3ljaF9kZXRhY2htZW50CmBgYApJdCBpcyBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBjaGVjayBvdXIgbnVtZXJpY2FsIHZhcmlhYmxlcyBmb3Igbm9ybWFsIGRpc3RyaWJ1dGlvbgoKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHggPSBQc3ljaG90aWNpc20pKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gLjUpICsgZ2d0aXRsZSgiUHN5Y2hvdGljaXNtIENvdW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHggPSBEZXRhY2htZW50KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC41KSArIGdndGl0bGUoIkhpc3RvZ3JhbSBvZiBEZXRhY2htZW50IFNjb3JlcyIpCmBgYCAKClRoZXJlIGlzIGRlZmludGVseSBzb21lIHJpZ2h0IHNrZXcgaW4gYm90aCBvZiB0aGUgaGlzdG9ncmFtcy4gV2UgY2FuIHVzZSB0aGUgc3ltYm94IGNvbW1hbmQgdG8gc2VlIGlmIGFueSB0cmFuc2Zvcm1hdGlvbnMgY291bGQgaGVscCB0aGUgZGF0YSBhcHBlYXIgbW9yZSBub3JtYWwuIFdlIHdpbGwgaG9sZCBvZmYgb24gdGhhdCBmb3Igbm93IHRob3VnaCBhbmQganVzdCBwcm9jZWVkIHdpdGggdGhlIG1vZGVsIHdlIGhhdmUuIAoKV2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgc29tZSBzY2F0dGVyIHBsb3RzIG9mIHRoZSBkYXRhIGJ1dCBsZXQncyBjaGVjayB0aGUgcmVzaWR1YWxzIGFuZCBnZXQgYW4gaW5kZWEgb2YgaW5mbHVlbnRpYWwgcG9pbnRzIGFuZCBwb3NzaWJsZSBvdXRsaWVycy4KCmBgYHtyfQpwbG90KFBzeWNoX2RldGFjaG1lbnQsIHdoaWNoID0gMToyKQoKYGBgCgpXaGlsZSB0aGUgUXVhbnRpbGUgcGxvdCBkb2Vzbid0IGxvb2sgdGVycmlibGUsIHRoZSBSZXNpZHVhbCBwbG90IGlzbid0IGdyZWF0LiBUaGUgbW9kZWxzIHByZWRpY3Rpb25zIGFyZSBub3QgYSBncmVhdCBmaXQuIFRoZXJlIGlzIGEgc2xpZ2h0IGJpdCBvZiBmYW5uaW5nIGFuZCB0aGUgZGF0YSBpc24ndCB0aGF0IGV2ZW5seSBkaXN0cmlidXRlZC4gTGV0J3MgY2hlY2sgb3V0IHRoZSBDb29rJ3MgZGlzdGFuY2VzIHdoaWNoIGlzIGFub3RoZXIgZGlyZWN0IG1lYXN1cmUgb2YgaW5mbHVlbmNlIChkaXNjcmVwZW5jeSB4IExldmVyYWdlKS4gVGhlIGluZmx1ZW5jZSBwbG90IHdpdGggY29va3MgZGlzdGFuY2VzIHJlc3ByZXNlbnRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgYnViYmxlIGlzIGEgbGl0dGxlIG92ZXJ3aGVsbWluZyB3aGVuIHdlIGhhdmUgdGhpcyBtdWNoIGRhdGEuIAoKYGBge3J9CmluZmx1ZW5jZVBsb3QoUHN5Y2hfZGV0YWNobWVudCkKYGBgCgojTXVsdGlwbGUgUmVncmVzc2lvbiBBbm92YQoKQmVsb3cgaXMgdGhlIG91dHB1dCBmcm9tIHRoZSBhbm92YSBjb21tYW5kLiBEZXRhY2htZW50IGhhcyBhIGh1Z2UgRiB2YWx1ZSBhbmQgYSByaWRpY3Vsb3VzbHkgc21hbGwgcC12YWx1ZSBpbmRpY2F0aW5nIGRldGFjaG1lbnQgaXMgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgcHN5Y2hvdGljaXNtLiBTZXggYWxzbyBoYXMgYSBzaWduaWZpY2FuY3QgcCB2YWx1ZSBidXQgYSBtdWNoIHNtYWxsZXIgRiBzY29yZSBhbmQgdmFsdWUgb3ZlcmFsbCwgc28gaXQgaGVscHMgZXhwbGFpbiB0aGUgbGV2ZWwgb2YgcHN5Y2hvdGljaXNtIGJ1dCBub3QgYSBzdHJvbmdseSBhcyBkZXRhY2htZW50IGluIHRoaXMgbW9kZWwuIAoKYGBge3J9CmFub3ZhKFBzeWNoX2RldGFjaG1lbnQpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpQc3ljaF9tZWFucyA8LSBwZXJzb25hbGl0eSAlPiUgZ3JvdXBfYnkoRGV0YWNobWVudCwgU2V4KSAlPiUgc3VtbWFyaXplKG1lYW5fcHN5Y2ggPSBtZWFuKFBzeWNob3RpY2lzbSkpCmhlYWQoUHN5Y2hfbWVhbnMpCmBgYAoKTm93IHdlIGNhbiBtYWtlIGFuIGludGVyYWN0aW9uIHBsb3QuIEl0IGlzIGEgbWVzc3kgcGxvdCBnaXZlbiB0aGUgc2hlZXIgYW1vdW50IG9mIGRhdGEgd2UgaGF2ZSBhbmQgaXQgaXNuJ3QganVzdCBhIHNpbXBsZSBsb3cgbWlkZGxlIGFuZCBoaWdoIGV4cGxhbmF0b3J5IHZhcmlhYmxlIG9uIHRoZSB4IGF4aXMgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byBmb2xsb3cgYW5kIHNlZSBpZiB0aGVyZSBhcmUgcGFycmFsbGVsIGxpbmVzLiBJIHNlZSBkaWZmZXJlbnRpYWwgc2xvcGVzIGJ1dCBJIGFsc28gZG8gc2VlIHNvbWUgbWlycm9yZWQgc2xvcGUgbW92ZW1lbnRzIHRocm91Z2hvdXQgdGhlIGdyYXBoLiBBbHRob3VnaCB0aGVyZSBhcmUgc29tZSBzcG90cyB0aGF0IGFyZSBwYXJyYWxsZWwgdGhlcmUgaXMgZW5vdWdoIHZhcmlhdGlvbiBiZXR3ZWVuIHRoZSBzbG9wZXMsIGFuZCB0aGV5IGRvIGNyb3NzIGF0IGEgZmV3IHBvaW50cyB3aGljaCBtYWtlcyBtZSB0aGluayB0aGVyZSBtYXkgYmUgYW4gaW50ZXJhY3Rpb24gcHJlc2VudC4gCgpgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9IFBzeWNob3RpY2lzbSwgeCA9IERldGFjaG1lbnQsIGNvbG9yID0gU2V4KSkgKyBnZW9tX3BvaW50KGRhdGEgPSBQc3ljaF9tZWFucywgYWVzKHkgPSBtZWFuX3BzeWNoLCB4ID0gRGV0YWNobWVudCwgY29sb3IgPSBTZXgpKSArIGdlb21fbGluZShkYXRhID0gUHN5Y2hfbWVhbnMsIGFlcyh5ID0gbWVhbl9wc3ljaCwgeCA9IERldGFjaG1lbnQsIGNvbG9yID0gU2V4KSkgKyBnZ3RpdGxlKCJJbnRlcmFjdGlvbiBQbG90IG9mIFBzeWNob3RpY2lzbSBBZ2FpbnN0IERldGFjaG1lbnQgR3JvdXBlZCBieSBHZW5kZXIiKQpgYGAKClRvIGV4cGxvcmUgYSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucyB3ZSBjYW4gYnVpbGQgYSBzZWNvbmQgbGluZWFyIG1vZGVsIHdpdGggYW4gaW50ZXJhY3Rpb24gdGVybSBhbmQgcnVuIGFuIEFOT1ZBIG9uIGJvdGggb2YgdGhlbSB0byBzZWUgaWYgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb24gaXMgc2lnbmlmaWNhbnQuCgpgYGB7cn0KUHN5Y2hfRGV0YWNoX0ludCA8LSBsbShQc3ljaG90aWNpc20gfiBEZXRhY2htZW50ICogU2V4LCBkYXRhID0gcGVyc29uYWxpdHkpCmFub3ZhKFBzeWNoX2RldGFjaG1lbnQsIFBzeWNoX0RldGFjaF9JbnQpCgpgYGAKClRoZSBhbm92YSBvdXRwdXQgaGFzIGEgdmVyeSBsb3cgRiBzY29yZSBhbmQgbGFyZ2UgUCB2YWx1ZSBzdWdnZXN0aW5nIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9uIGRvZXMgbm90IHByb3ZpZGUgYW55IG1vcmUgc3RhdGlzdGljYWwgcG93ZXIgdGhhbiB0aGUgbW9kZWwgd2l0aG91dCBpbnRlcmFjdGlvbi4gCgpCZWxvdyB3ZSB1c2UgdGhlIHRpZHkgY29tbWFuZCB0byBlYXNpbHkgZ2V0IG91ciBlc3RpbWF0ZXMgZm9yIGludGVycHJldGF0aW9uLgoKYGBge3J9CmxpYnJhcnkoYnJvb20pClBzeWNoX1RpZHkgPC0gdGlkeShQc3ljaF9EZXRhY2hfSW50KQpQc3ljaF9UaWR5CmBgYAoKSW50ZXJjZXB0OiBXaGVuIGRldGFjaG1lbnQgYW5kIGdlbmRlciBhcmUgMCB0aGUgbW9kZWwgcHJlZGljdHMgcHN5Y2hvdGljaXNtIHdpbGwgYmUgMS4xMSwgdGhlIGludGVyY2VwdCBvZnRlbiBkb2Vzbid0IG1ha2Ugc2Vuc2UgaW4gdGhpcyB0eXBlIG9mIHJlZ3Jlc3Npb24gdW5sZXNzIHdlIG1lYW4gY2VudGVyLiAKCkRldGFjaG1lbnQ6IEFzIGRldGFjaG1lbnQgaW5jcmVhc2VzIG9uZSB1bml0LCB0aGUgbW9kZWwgcHJlZGljdHMgdGhhdCB0aGUgcHN5Y2hvdGljaXNtIHNjb3JlIHdpbGwgaW5jcmVhc2UgYnkgLjYwOCBmb3IgYm90aCBmZW1hbGUgYW5kIG1hbGVzLgoKR2VuZGVyTTogVGhlIE1vZGVsIHByZWRpY3RzIHRoYXQgbWFsZXMgd2lsbCBoYXZlIGEgcHJlZGljdGVkIHBzeWNob3RpY2lzbSBzY29yZSB0aGF0IGlzIDAuNDY1IHBvaW50cyBtb3JlIHRoYW4gZmVtYWxlcyB3aXRoIHRoZSBzYW1lIGRldGFjaG1lbnQgc2NvcmUuIAoKRGV0YWNobWVudDpTZXhNID0gVGhlIG1vZGVsIHByZWRpY3RzIHRoYXQgdGhlIHNsb3BlIG9mIHRoZSByZWdyZXNzaW9uIGxpbmUgZm9yIGEgTWFsZSB3aWxsIGJlIDAuMDUyIHBvaW50cyBzbWFsbGVyIHRoYW4gdGhlIHNsb3BlIGZvciBmZW1hbGVzLgoKCiMjQU5PVkEKCldlIHdpbGwgdXNlIHRoZSBzYW1lIHJlc3BvbnNlIHZhcmlhYmxlIG9mIHBzeWNob3RpY2lzbSBzY29yZSBhbmQgd2Ugd2lsbCBjb250aW51ZSB0byB1c2UgZ2VuZGVyIGFzIGEgY2F0ZWdvcmljYWwgZXhwbGFuYXRvcnkgdmFyaWFibGUgaG93ZXZlciwgaW5zdGVhZCBvZiB1c2luZyBkZXRhY2htZW50IHNjb3JlIHdlIHdpbGwgdXNlIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0aWNpcGFudCBtYWtlcyBtdXNpYyBvciBub3QuIApgYGB7cn0KcGVyc29uYWxpdHlfY29udCA8LSBwZXJzb25hbGl0eQpjb250cmFzdHMocGVyc29uYWxpdHlfY29udCRTZXgpIDwtICJjb250ci5zdW0iCmNvbnRyYXN0cyhwZXJzb25hbGl0eV9jb250JFNleCkKYGBgCgpEZXZpYW5jZSBjb2RpbmcgdGhlIHNlY29uZCBleHBsYW5hdG9yeSB2YXJpYWJsZQoKYGBge1J9CmNvbnRyYXN0cyhwZXJzb25hbGl0eV9jb250JE11c2ljKSA8LSAiY29udHIuc3VtIgpjb250cmFzdHMocGVyc29uYWxpdHlfY29udCRNdXNpYykKYGBgCgpDcmVhdGluZyB0aGUgQW5vdmEgbW9kZWwKCmBgYHtyfQpQc3ljaF9Bbm92YSA8LSBsbShQc3ljaG90aWNpc20gfiBTZXggKyBNdXNpYywgZGF0YSA9IHBlcnNvbmFsaXR5X2NvbnQpCkFub3ZhKFBzeWNoX0Fub3ZhKQpgYGAgCgpUaGUgb3V0cHV0IGZyb20gdGhlIGFub3ZhIHRhYmxlIHN1Z2dlc3RzIHRoYXQgU2V4IGlzIGEgdmVyeSBzaWduaWZpY2FudCBmYWN0b3IgaW4gcHJlZGljdGluIHBzeWNob3RpY2lzbSBzY29yZXMsIGFuIEYgdmFsdWUgb2YgMTkuNCBpcyB2ZXJ5IGhpZ2ggYW5kIHdlIGhhdmUgYW4gYW4gaW5jcmVkaWJseSBzbWFsbCBwIHZhbHVlLiBNdXNpYyBhcHBlYXJzIHRvIGJlIGxlc3Mgc2lnbmlmaWNhbnQgdGhhbiBTZXggYnV0IGlzIHN0aWxsIHdlbGwgYmVsb3cgb3VyIHRocmVzaG9sZCBvZiAuMDUgc3VnZ2VzdGluZyB0aGF0IG11c2ljIGhhcyBhIHNpZ25maWNhbnQgZWZmZWN0IG9uIGFuIGluZGl2aWR1YWxzIHBzeWNob3RpY2lzbSBzY29yZS4gQmVsb3cgaXMgYW4gb3V0cHV0IG9mIHRoZSBlc3RpbWF0ZXMgZnJvbSB0aGlzIG1vZGVsLiAKCmBgYHtyfQpQc3ljaF9Bbm92YV90aWR5IDwtIHRpZHkoUHN5Y2hfQW5vdmEpClBzeWNoX0Fub3ZhX3RpZHkKYGBgCgpPdXIgaW50ZXJjZXB0IG9mIDIuNTEgaXMgdGhlIGdyYW5kIG1lYW4uIFNleDEgd2hpY2ggaXMgZmVtYWxlcyBpcyAwLjIzOSBwb2ludHMgYmVsb3cgdGhlIGdyYW5kIG1lYW4gb2YgMi41MS4gTXVzaWMxIGlzIGNvZGVkIGFzIDEgZm9yIG5vIGFuZCAtMSBmb3IgeWVzLiBTbyBOb24gbXVzaWNpYW5zIHdpbGwgaGF2ZSBhIHBzeWNob3RvY2lzbSBzY29yZSB0aGF0IGlzIDAuMTU5IHBvaW50IGJlbG93IHRoZSBncmFuZCBtZWFuLgoKKlRlc3RpbmcgRm9yIEludGVyYWN0aW9uKgoKQ2FsY3VsYXRlIHRoZSBjZWxsIG1lYW5zCgpgYGB7Un0KcHN5Y2hvdGljaXNtX2Fub3ZhX21lYW5zIDwtIHBlcnNvbmFsaXR5X2NvbnQgJT4lIGdyb3VwX2J5KFNleCwgTXVzaWMpICU+JSBzdW1tYXJpemUobWVhbl9wc3ljaF9hbm92YSA9IG1lYW4oUHN5Y2hvdGljaXNtKSkKcHN5Y2hvdGljaXNtX2Fub3ZhX21lYW5zCmBgYAoKQ3JlYXRpbmcgYW4gSW50ZXJhY3Rpb24gUGxvdAoKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eV9jb250LCBhZXMoeSA9IFBzeWNob3RpY2lzbSwgeCA9IFNleCwgY29sb3IgPSBNdXNpYykpICsgZ2VvbV9wb2ludChkYXRhID0gcHN5Y2hvdGljaXNtX2Fub3ZhX21lYW5zLCBhZXMoeSA9IG1lYW5fcHN5Y2hfYW5vdmEsIHggPSBTZXgsIGNvbG9yID0gTXVzaWMpKSArIGdlb21fbGluZShkYXRhID0gcHN5Y2hvdGljaXNtX2Fub3ZhX21lYW5zLCBhZXMoeSA9IG1lYW5fcHN5Y2hfYW5vdmEsIHggPSBTZXgsIGdyb3VwID0gTXVzaWMpKSArIGdndGl0bGUoIkludGVyYWN0aW9uIFBsb3Qgb2YgUHN5Y2hvdGljaXNtIEFnYWluc3QgR2VuZGVyIGFuZCBNdXNpYyIpCmBgYApCZWNhdXNlIHdlIHNlZSB2ZXJ5IHBhcnJhbGxlbCBsaW5lcyBpdCB3b3VsZCBpbXBseSB0aGF0IHRoZXJlIGlzIG5vIGludGVyYWN0aW9uLiAKCldlIGNhbiBidWlsZCBhbm90aGVyIG1vZGVsIHdpdGggdGhlIGludGVyYWN0aW9uIHRlcm0gYW5kIHJ1biBhbiBBTk9WQSBvbiBib3RoIG1vZGVscyB0byBzZWUgaWYgdGhlIGludGVyYWN0aW9uIHRlcm0gYWRkcyBhbnkgc2lnbmlmaWNhbnQgdmFsdWUuIApgYGB7cn0KUHN5Y2hfQW5vdmFfSW50IDwtIGxtKFBzeWNob3RpY2lzbSB+IFNleCArIE11c2ljICsgU2V4Ok11c2ljLCBkYXRhID0gcGVyc29uYWxpdHlfY29udCkKYW5vdmEoUHN5Y2hfQW5vdmEsUHN5Y2hfQW5vdmFfSW50KQpgYGAgCgpJdCB3b3VsZCBhcHBlYXIgdGhhdCB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBub3Qgc2lnbmlmaWNhbnQuIAoKV2UgY2FuIGdhdGhlciB0aGUgbWVhbnMgZnJvbSB0aGUgY29lZmZpY2llbnRzIGFuZCB3ZSB3aWxsIHVzZSB0aGUgaW50ZXJhY2F0aW9uIG1vZGVsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgYXBwZWFyIG1vcmUgZWZmZWN0aXZlIHRoYW4gdGhlIG1haW4gZWZmZWN0cyBtb2RlbC4gCgpgYGB7cn0KdGlkeShQc3ljaF9Bbm92YV9JbnQpCmBgYAoKClRoZSBpbnRlcmNlcHQgYWdhaW4gaXMgb3VyIGdyYW5kIG1lYW4gb2YgMi41MS4gU2V4IGlzIGNvZGVkIEYgPSAxIGFuZCBNID0gLTEgYW5kIE11c2ljIGlzIGNvZGVkIE5vID0gMSBhbmQgWWVzID0gLTEuIFNvIHRvIGdldCB0aGUgbWVhbiBvZiBmZW1hbGVzIHdobyBkb24ndCBwcmFjdGljZSBtdXNpYyB3ZSBzdGFydCB3aXRoIHRoZSBncmFuZCBtZWFuIG9mIDIuNTEgLSAwLjI1OCAtIDAuMTgwICsgMC4wNDc4IChiZWNhdXNlIGJvdGggc2V4IGFuZCBNdXNpYyBhcmUgIm9uIikgPSAyLjExOTguIFRvIGdldCB0aGUgbm9uLW11c2ljaWFuIG1hbGVzIHdlIHN0YXJ0IHdpdGggdGhlIGdyYW5kIG1lYW4gMi41MSArIDAuMjU4IC0gLjE4MCAtIDAuMDQ3OCAoYmVjYXVzZSBzZXhNICgtMSkqTXVzaWMxKDEpID0gLTEpID0gMi41MDIuIEZlbWFsZSBNdXNpY2lhbnM6IDIuNTEgLSAuMjU4ICsgLjE4MCAtIDAuMDQ3OCA9IDIuMzg0LiBNYWxlIE11c2ljaWFuczogMi41MSArIC4yNTggKyAuMTgwICsgLjA0NzggPSAyLjk5NgoKCgoKIyNNZWFuaW5nZnVsIE1vZGVsCgpXZSB3aWxsIHJlZmVyIGJhY2sgdG8gdGhlIG1vZGVsIHVzZWQgaW4gdGhlIG11bHRpcGxlIHJlZ3Jlc3Npb24uIEFzIHdlIHNhdyBhYm92ZSBpdCBsb29rZWQgbGlrZSBvdXIgZGF0YSBjb3VkIGJlbmVmaXQgZnJvbSBhIHRyYW5zZm9ybWF0aW9uLiBMZXQncyBsb29rIGF0IGEgcXVpY2sgaGlzdG9ncmFtIG9mIHB5c2hjb3RpY2lzbSBzY29yZXMgYWdhaW4uIEFzIHdlIGNhbiBzZWUgZnJvbSB0aGUgaGlzdG9ncmFtIHdlIGhhdmUgc29tZSBsZWZ0IHNrZXcgaW4gdGhlIGRhdGEuCgpgYGB7Un0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeCA9IFBzeWNob3RpY2lzbSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuNSkgKyBnZ3RpdGxlKCJIaXN0b2dyYW0gRGlzcGxheWluZyBTa2V3ZWQgZGF0YSBmb3IgUHN5Y2hvdGljaXNtIHNjb3JlcyIpIApgYGAKClVzaW5nIHRoZSBzeW1ib3ggY29tbWFuZCBmcm9tIHRoZSBjYXIgcGFja2FnZSB3ZSBjYW4gdGVzdCBkaWZmZXJlbnQgbGFtYmRhIHZhbHVlcyB0byBzZWUgd2hhdCBraW5kIG9mIHRyYW5zZm9ybWF0aW9uIHdpbGwgd29yayBiZXN0LiBBcyB3ZSBzZWUgYmVsb3cgd2UgY2FuIGdldCBjbG9zZXIgdG8gYSBub3JtYWwgbW9kZWwgYnkgdXNpbmcgYSBwb3dlciB0cmFuc2Zvcm1hdGlvbiBvZiAuNSAoc3F1YXJlIHJvb3QpIGJ1dCB0aGUgbG9nIHRyYW5zZm9ybWF0aW9uIGxvb2tzIGFsbW9zdCBhcyBnb29kLCBhbmQgd2Uga25vdyBob3cgdG8gaW50ZXJwcmV0IGxvZyB0cmFuc2Zvcm1hdGlvbnMgd2l0aG91dCBiYWNrIHRyYW5zZm9ybWluZyByZXN1bHRzLiBGb3IgdGhhdCByZWFzb24gd2Ugd2lsbCB1c2UgdGhlIGxvZyBpbnN0ZWFkIG9mIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uLiAKCmBgYHtyfQpsaWJyYXJ5KGNhcikKc3ltYm94KH4gUHN5Y2hvdGljaXNtLCBkYXRhID0gcGVyc29uYWxpdHkpCmBgYApMZXQncyBjaGVjayB0aGUgaGlzdG9ncmFtIGZvciBkZXRhY2htZW50IGFnYWluIHRvIGFzc2VzcyBwb3NzaWJsZSBza2V3LiBTaW1pbGFyIHRvIFB5c2Nob3RpY2lzbSwgdGhlcmUgc2VlbXMgdG8gYmUgc29tZSBsZWZ0IHNrZXcgaW4gdGhlIGRhdGEuIAoKYGBge3J9CmdncGxvdChwZXJzb25hbGl0eSwgYWVzKHggPSBEZXRhY2htZW50KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNzUpICsgZ2d0aXRsZSgiSGlzdG9ncmFtIFNob3dpbmcgU2tld2VkIGRhdGEgZm9yIERldGFjaG1lbnQiKQpgYGAKQWdhaW4gd2UgY2FuIHVzZSBzeW1ib3ggdG8gc2VlIHdoYXQgdHlwZSBvZiB0cmFuc2Zvcm1hdGlvbiBtYXkgZml0IGJlc3Qgd2l0aCB0aGUgRGV0YWNobWVudCBkYXRhLiBBZ2FpbiwgYSBwb3dlciB0cmFuc2Zvcm1hdGlvbiBvZiAwLjUgKHNxdWFyZSByb290KSB3b3VsZCBhcHBlYXIgdG8gZml0IGJlc3QuIEJ1dCBpbnRlcnByZXR0aW5nIHNxdWFyZSByb290cyBpcyBhIGxvdCBsZXNzIGludHVpdGl2ZSB0aGFuIGludHJlcHJldHRpbmcgbm9ybWFsIG9yIGxvZyB0cmFuc2Zvcm1lZCBkYXRhIHNvIHdlIHdpbGwgc3RpY2sgd2l0aCB0aGUgbG9nIHRyYW5zZm9ybWF0aW9uIGJlY2F1c2Ugd2hpbGUgaXQgZG9lc24ndCBsb29rIGFzIHBlcmZlY3QgYXMgdGhlIDAuNSB0cmFuc2Zvcm1hdGlvbiwgaXQgbG9va3MgYmV0dGVyIHRoYW4gdGhlIG9yaWdpbmFsIGRhdGEuIAoKCmBgYHtyfQpzeW1ib3gofiBEZXRhY2htZW50LCBkYXRhID0gcGVyc29uYWxpdHkpIApgYGAKQmVsb3cgaXMgYSBoaXN0b2dyYW0gb2YgbG9nIHRyYW5zZm9ybWVkIGRldGFjaG1lbnQuIFdoaWxlIHRoZSBpdCBpcyBhIGJpdCByaWdodCBza2V3ZWQgbm93IGl0IHdpbGwgYmUgbXVjaCBlYXNpZXIgdG8gaW50ZXJwcmV0IHRoZSBsb2cgb2YgZGV0YWNobWVudCByYXRoZXIgdGhhbiB0aGUgc3F1YXJlIHJvb3Qgb2YgZGV0YWNobWVudC4gSXQgZG9lcyBsb29rIGEgbGl0dGUgYmV0dGVyIHRoYW4gdGhlIG9yaWdpbmFsIGRhdGEuIApgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeCA9IGxvZyhEZXRhY2htZW50KSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuNSkgKyBnZ3RpdGxlKCJOb3JtYWxpemVkIChMb2cpIGhpc3RvZ3JhbSBvZiBEZXRhY2htZW50IikKYGBgCgpXZSB3aWxsIHByb2NlZWQgd2l0aCB0aGUgbG9nIHRyYW5zZm9ybWVkIHJlc3BvbnNlIHZhcmlhYmxlIG9mIFBzeWNob3RpY2lzbSBhbmQgdGhlIGxvZyB0cmFuc2Zvcm1lZCBleHBsYW5hdG9yeSB2YXJpYWJsZSBEZXRhY2htZW50LiBHZW5kZXIgb2J2aW91c2x5IGRvZXNuJ3QgbmVlZCB0byBiZSB0cmFuc2Zvcm1lZCBhcyBpdCBpcyBhIGJpbmFyeSBmYWN0b3IgdmFyaWFibGUuIEJlbG93IGFyZSBib3RoIHRoZSBsb2cgdHJhbnNvcm1lZCBzY2F0dGVycGxvdCBhbmQgdGhlIG5vcm1hbCB1bnRyYW5zZm9ybWVkIHNjYXR0ZXJwbG90LiBKdXN0IGF0IGEgcXVpY2sgZ2xhbmNlIHRoZXJlIGRvbid0IGFwcGVhciB0byBiZSBhbnkgbWFqb3Igb3V0bGllcnMgaW4gZWl0aGVyIHBsb3QuIFRoZXJlIGFyZSBhIGZldyBwb2ludHMgdGhhdCBhcmUgYSBsaXR0bGUgZnVydGhlciBhd2F5IGZyb20gdGhlIGdlbmVyYWwgZGF0YSBjbHVzdGVyIGJ1dCB0aGV5IGRvbid0IGFwcGVhciBmYXIgZW5vdWdoIGF3YXkgYXQgZmlyc3QgZ2xhbmNlIHRvIGtub3cgaWYgdGhleSBhcmUgdHJ1bHkgb3V0bGllcnMuIFdlIHdpbGwgbWFrZXMgc29tZSBpbmZsdW5lY2UgcGxvdHMgdG8gdGVzdCBmb3Igb3V0bGllcnMuIAoKCmBgYHtyfQpnZ3Bsb3QocGVyc29uYWxpdHksIGFlcyh5ID0gbG9nKFBzeWNob3RpY2lzbSksIHggPSBsb2coRGV0YWNobWVudCksIGNvbG9yID0gU2V4KSkgKyBnZW9tX3BvaW50KCkgKyBnZ3RpdGxlKCJMb2cgUHNjaG90aWNpc20gc2NvcmVzIGFnYWluc3QgTG9nIERldGFjaG1lbnQgc2NvcmVzIGFuZCBHZW5kZXIiKQpgYGAKCgpgYGB7cn0KZ2dwbG90KHBlcnNvbmFsaXR5LCBhZXMoeSA9IFBzeWNob3RpY2lzbSwgeCA9IERldGFjaG1lbnQsIGNvbG9yID0gU2V4KSkgKyBnZW9tX3BvaW50KCkgKyBnZ3RpdGxlKCJQc2Nob3RpY2lzbSBzY29yZXMgYWdhaW5zdCBEZXRhY2htZW50IHNjb3JlcyBhbmQgR2VuZGVyIikKYGBgClRvIGZ1cnRoZXIgdGVzdCBmb3Igb3V0bGllcnMgd2UgbmVlZCB0byBidWlsZCB0aGUgbGluZWFyIG1vZGVsIHNvIHdlIHdpbGwgZG8gdGhhdCByZWFsIHF1aWNrbHkuCgpgYGB7cn0KcGVyc29uYWxpdHkyIDwtIGRhdGEuZnJhbWUocGVyc29uYWxpdHkgJT4lIG11dGF0ZShQc3ljaG90aWNpc20gPSBQc3ljaG90aWNpc20gKyAxLCBkZXRhY2htZW50ID0gRGV0YWNobWVudCArIDEsIFNleCA9IFNleCkpCgpQc3ljaG90aWNpc21fTE0gPC0gbG0obG9nKFBzeWNob3RpY2lzbSkgfiBsb2coZGV0YWNobWVudCkgKyBTZXgsIGRhdGEgPSBwZXJzb25hbGl0eTIpCmBgYAoKClRvIHN0YXRpc3RpY2FsbHkgdGVzdCBmb3Igb3V0bGllcnMgd2UgY2FuIHVzZSBhIGJ1aWx0IGluIGNvbW1hbmQgY2FsbGVkIE91dGxpZXJUZXN0LiBUaGUgYmFzaWMgcHJpbmNpcGxlIGlzIHRvIHJ1biBUIHRlc3RzIHRvIGV4YW1pbmUgcmVzaWR1YWxzIGJ1dCB3ZSBydW4gaW50byBhIHByb2JsZW0gb2YgbXVsdGlwbGUgY29tcGFyaXNvbnMgd2hlbiB3ZSBydW4gc28gbWFueSBUIHRlc3RzLiBXaXRoIGEgYWxwaGEgb2YgMC4wNSB0aGF0IG1lYW5zIHdlIHdpbGwgZ2V0IGEgZmFsc2UgcG9zaXRpdmUgb25jZSBldmVyeSAyMCB0ZXN0cyBidXQgd2UgaGF2ZSBvdmVyIGEgMTAwMCBkYXRhIHBvaW50cyBpbiB0aGlzIGRhdGEgZnJhbWUgc28gd2Ugd291bGQgc2VlIGZhbHNlIHBvc2l0aXZlcyBpZiB3ZSB3ZXJlIHRvIHByb2NlZWQgd2l0aCBhbiBhbHBoYSBsZXZlbCBvZiAwLjA1LiBUaGUgT3V0bGllclRlc3QgZmFjdG9ycyB0aGlzIGluIGJ5IGRpdmlkaW5nIG91ciBhbHBoYSBvZiAwLjA1IGJ5IHRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHMgYW5kIHRoYXQgc2hvdWxkIGhlbHAgcHJldmVudCBmYWxzZSBwb3NpdGl2ZXMuIFdlIGxpa2VseSB3b24ndCBzZWUgYW55IG91dGxpZXJzIG5vdyBiZWNhdXNlIHdlIGhhdmUgc3VjaCBhIHNtYWxsIGFscGhhIHRocmVzaG9sZC4gVGhlIGdvb2QgdGhpbmcgaXMgdGhhdCB3aXRoIHN1Y2ggYSBsYXJnZSBkYXRhIHNldCB0aGUgaW5mbHVlbmNlIHRoYXQgYW55IHBvc3NpYmxlIG91dGxpZXJzIG1heSBoYXZlIHdvdWxkIGJlIHNtYWxsIGFuZCBob3BlZnVsbHkgbm90IHNrZXcgb3VyIHJlZ3Jlc3Npb24gYW5hbHlzaXMgdG9vIG11Y2guCmBgYHtyfQpvdXRsaWVyVGVzdChQc3ljaG90aWNpc21fTE0pCmBgYAoKQWZ0ZXIgQm9uZmVyb25uaSBjb3JyZWN0aW9ucyB0aGVyZSBhcmUgbm8gbWFqb3Igb3V0bGllcnMgaW4gb3VyIGRhdGEgc2V0LiBUaGlzIG91dHB1dCBzaG93cyB1cyB3aGljaCBvZiB0aGUgcG9pbnRzIGhhZCB0aGUgbGFyZ2VzdCByZXNpZHVhbC4gSXQgYXBwZWFycyBwYXJ0aWNwYW50IDc2OSBoYWQgdGhlIGxhcmdlc3QgcmVzaWR1YWxzIGJ1dCB0aGVzZSB3ZXJlIHN0aWxsIG5vdCBzaWduaWZpY2FudCBhZnRlciBCb25mZXJvbm5pIGNvcnJlY3Rpb25zLiAKCgpXZSBjYW4gYWxzbyBsb29rIGF0IHRoZSBEZmJldGFzIG9mIHRoZSBsaW5lYXIgbW9kZWwgd2hpY2ggd2lsbCBzaG93IHRoZSBlZmZlY3Qgb2YgcmVtb3ZpbmcgcG9zc2libHkgaW5mbHVlbnRpYWwgcG9pbnRzIG9uIHRoZSBpbnRlcmNlcHQgYW5kIHNsb3BlIG9mIHRoZSByZWdyZXNzaW9uLiBEZmJldGFzIGlzIGEgbW9yZSBzdGFuZGFyZGl6ZWQgdmVyc2lvbiBvZiBkZmJldGEgdGFrZW4gYnkgZGl2aWRpbmcgdGhlIGRmYmV0YSBieSB0aGUgc3RhbmRhcmQgZXJyb3Igd2l0aG91dCB0aGUgcG9pbnQgb2YgaW50ZXJlc3QuIEJhc2ljYWxseSB3ZSBhcmUgbG9va2luZyBvdXQgZm9yIHBvaW50cyBsYXJnZXIgdGhhbiAyIHdoaWNoIG5vbmUgb2Ygb3VyIGRhdGEgZXZlbiBnZXRzIGNsb3NlIHRvIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgbXVjaCBoZXJlLiAKYGBge3J9CmhlYWQoZGZiZXRhcyhQc3ljaG90aWNpc21fTE0pKQpgYGAKCldlIGNhbiBsb29rIGF0IGluZmx1ZW5jZSBwbG90cyBzdWNoIGFzIGEgcmVzaWR1YWwgcGxvdCB0byBzaG93IHVzIGFueSBwYXR0ZXJucyBvciBhbm9tb2xpZXMgaW4gdGhlIHJlc2lkdWFscy4gV2UgY2FuIGFsc28gbG9vayBhdCBhIFFRIHBsb3Qgb2YgdGhlIHJlc2lkdWFscyB0byBzZWUgaWYgdGhlIHJlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQKCgpgYGB7cn0KcGxvdChQc3ljaG90aWNpc21fTE0sIHdoaWNoID0gMToyKQpgYGAKCgpPdmVyYWxsIHRoZXJlIGRvbid0IHNlZW0gdG8gYW55IG1ham9yIHBhdHRlcm5zIGluIHRoZSByZXNpZHVhbCBwbG90LCB0aGVyZSBpcyBwZXJoYXBzIHNvbWUgZmFubmluZyBvZiB0aGUgZGF0YSAoaGV0ZXJvc2tlZGFzdGljaXR5KSBidXQgdGhlIGRhdGEgZG9lcyBsb29rIG5vcm1hbCBlbm91Z2guIExvb2tpbmcgYXQgb3VyIFFRIHBsb3QgdGhlIGRhdGEgZG9lcyBmb2xsb3cgdGhlIGxpbmUgZm9yIHRoZSBtb3N0IHBhcnQgYnV0IHdlIGhhdmUgc29tZSBkZXZpYXRpb25zIGZyb20gdGhlIHBsb3QgYXQgdGhlIHRhaWwgZW5kcyBidXQgYmV5b25kIHRob3NlIHNsaWdodCBjdXJ2YXR1cmVzIHRoZXJlIGlzIG5vIG1ham9yIGN1cnZpbmcgb2YgdGhlIFFRIHBsb3QuIAoKV2UgYWxyZWFkeSBjaGVja2VkIGEgbW9kZWwgcHJldmlvdXNseSB0aGF0IHVzZWQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBnZW5kZXIgYW5kIGRldGFjaG1lbnQgc2NvcmUgdGhhdCBkaWRuJ3QgYXBwZWFyIHRvIGJlIHNpZ25pZmljYW50IHNvIHdlIHdpbGwgY29udGludWUgd2l0aCBvdXIgbGluZWFyIG1vZGVsIHdpdGhvdXQgaW50ZXJhY3Rpb24uIAoKYGBge3J9ClBzeWNob3RpY2lzbV9MTQpgYGAKVGhlIG1vZGVsIHByZWRpY3RzIHRoYXQgYSBvbmUgcGVyY2VudCBpbmNyZWFzZSBpbiBEZXRhY2htZW50IHdpbGwgaW5jcmVhc2UgdGhlIHBzeWNob3RpY2lzbSBzY29yZSBieSAuNTUgcGVyY2VudC4gU2ltaWxhcmx5LCB0aGUgbW9kZWwgcHJlZGljdHMgdGhhdCBieSBiZWluZyBtYWxlIHlvdXIgcHN5Y2hvdGljaXNtIHNjb3JlIGlzIGluY3JlYXNlZCBieSAuMTIgcGVyY2VudC4gQWdhaW4gYnkgY2hlY2tpbmcgYW4gYW5vdmEgdGFibGUgdG8gc2VlIHRoZSBzaWduaWZpY2FuY2Ugb2Ygb3VyIGVmZmVjdHMgc2hvd3MgdXMgdGhhdCBkZXRhY2htZW50IGlzIGEgdmVyeSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgcHN5Y2hvdGljaXNtIHNjb3JlLiBOb3QgYXMgc2lnbmlmaWNhbnQgYnV0IHN0aWxsIGZhaXJseSBzaWduaWZpY2FudCBpcyBnZW5kZXIsIHRoZSBtYWxlIGdlbmRlciB0ZW5kZWQgdG8gaGF2ZSBzbGlnaHRseSBoaWdoZXIgcHN5Y2hvdGljaXNtIHNjb3JlcyBhbmQgdGhlIGFub3ZhIGNvbmZpcm1zIHRoYXQgZ2VuZGVyIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgcHN5Y2hvdGljaXNtIGJ1dCBub3QgYXMgd2VsbCBhcyBkZXRhY2htZW50IHNjb3JlLiAKCmBgYHtyfQphbm92YShQc3ljaG90aWNpc21fTE0pCmBgYAoK